import random
import string


class Typing(object):
    """
    封装一个类， 用于创建一个打字游戏
    """

    def __init__(self, path=""):
        # 创建52个英文字母，大小写
        self.characters = [chr(i) for i in range(65, 91, 1)] + [chr(i) for i in range(97, 123, 1)]
        if path != "":
            self.path = path    # 使用指定文件
        else:
            self.path = self.file_path()    # 从文件池随机选取文件

    def file_path(self) -> string:
        """
        文件路径池， 如果不指定文件， 则随机挑选一个文件进行读取
        :return: 文件路径
        """
        path = ["./words.txt", "./a.txt"]
        index = random.randint(0, len(path) - 1)
        return path[index]

    def menu(self):
        print("---------- 欢迎来到打字游戏 --------")
        print("----\t1. 简单模式\t\t\t----")
        print("----\t2. 中等模式\t\t\t----")
        print("----\t3. 困难模式\t\t\t----")
        print("----\t4. 自定义模式\t\t\t----")
        print("----\t0. 退出\t\t\t\t----")
        print("--------------------------------")

    def read_file(self):
        """
        从文件中读取数据， 每一行作为一个元素“句子”
        :return: 句子列表
        """
        with open(self.path, 'r', encoding='utf-8') as fp:
            sentence_list = []
            for sentence in fp.readlines():
                sentence_list.append(sentence.strip())
        return sentence_list

    def create_sentence(self) -> string:
        """
        生成一行由 ”单词“ 组成的 “句子”
        :return: 返回 “句子”
        """
        # 定义一行有多少单词
        words_num = random.randint(10, 30)
        # 生成一行单词
        sentence = ""
        for j in range(words_num):
            # 定义每个单词字母数量
            chars_num = random.randint(2, 6)
            # 生成一个单词
            word = []
            for i in range(chars_num):
                index = random.randint(0, len(self.characters) - 1)
                word.append(self.characters[index])
            word = "".join(word)
            sentence = sentence + word + " "
        return sentence.strip()

    def run(self, sentence):
        # 系统创建 ”句子“
        print(f">>{sentence}<< 字符数: {len(sentence)}, 单词数: {len(sentence.split(' '))}")
        # 创建用于存储用户输入的字符
        w_sentence = input()
        print("==== 正在核对输入信息 ====")
        print("请稍后...")
        # 循环判断输入是否正确
        while True:
            # 标记全部输入正确
            win = True
            # 判断字符
            for i in range(len(w_sentence)):
                if w_sentence[i] == sentence[i]:
                    print(f"第{i + 1}个字母: {sentence[i]}, 输入: {w_sentence[i]}, 核对: Perfect")
                else:
                    print(f"第{i + 1}个字母: {sentence[i]}, 输入: {w_sentence[i]}, 输入错误, 请重新输入!")
                    win = False
                    break
            # 全部输入正确
            if win:
                print("恭喜你全部正确！！！")
                break
            # 输入有误，重新输入
            else:
                w_sentence = input()
                continue

    def diy(self):
        """
        自定义打字内容
        :return: pass
        """
        # 对从文件读取的内容 去空行, 遍历文件内容
        line = 1
        for sentence in [x.strip() for x in self.read_file() if x != '']:
            print(f"第{line}行: ", end='')
            self.run(sentence)
            line += 1

    def begin(self):
        while True:
            self.menu()
            choose = input("请选择>:")
            sentence = self.create_sentence()
            if choose == '1':
                self.run(sentence.lower())  # 转小写--简单模式
            elif choose == '2':
                self.run(sentence.title())  # 单词首字母大写--中等模式
            elif choose == '3':
                self.run(sentence)          # 大小写随机--困难模式
            elif choose == '4':
                self.diy()                  # 自定义模式
            elif choose == '0':
                print("欢迎再次使用！！")
                break
            else:
                print("输入错误， 请重新选择！")


if __name__ == '__main__':
    typing = Typing()
    typing.begin()
